package cn.com.utils;

import java.awt.Desktop;
import java.io.IOException;
import java.net.URI;
import java.util.List;
import java.util.Map;
import java.util.function.Consumer;

/**
 * 浏览器打开程序util
 * Java调用浏览器打开指定页面的示例
 *
 * @author LiuGuodong
 * @date 2024/01/22
 */
public class BrowserOpenerUtil {

    /**
     * 使用默认浏览器打开指定URL
     *
     * @param url 要打开的URL
     * @throws IOException 如果发生I/O异常
     */
    public static void openDefaultBrowser(String url) throws IOException {
        Desktop desktop = Desktop.getDesktop();
        if (Desktop.isDesktopSupported() && desktop.isSupported(Desktop.Action.BROWSE)) {
            URI uri = URI.create(url);
            desktop.browse(uri);
        }
    }

    /**
     * 批量使用默认浏览器打开指定URL
     *
     * @param urls url
     */
    public static void openDefaultBrowser(List<String> urls) {
        for (String url : urls) {
            try {
                openDefaultBrowser(url);
            } catch (IOException e) {
                System.out.println(e.getMessage());
            }
        }

    }


    /**
     * 通过获取环境变量的浏览器路径，然后启动浏览器
     *
     * @param url 要打开的URL
     * @throws IOException 如果发生I/O异常
     */
    private static void openWithEnvironmentBrowser(String url) throws IOException {
        String firefoxPath = "C:\\Program Files\\Mozilla Firefox\\firefox.exe";
        Map<String, String> environment = System.getenv();
        for (String key : environment.keySet()) {
            String value = environment.get(key);
            if (value.contains("firefox.exe")) {
                firefoxPath = value;
                break;
            }
        }
        Runtime.getRuntime().exec(new String[]{firefoxPath, url});
    }

    /**
     * 启用cmd运行默认浏览器来打开网址
     *
     * @param url 要打开的URL
     * @throws IOException 如果发生I/O异常
     */
    private static void openWithCmd(String url) throws IOException {
        Runtime.getRuntime().exec("cmd /c start " + url);
    }

    /**
     * 利用java.lang.ProcessBuilder类创建系统进程的能力，通过浏览器地址启动浏览器，并将网址作为参数传送给浏览器。
     *
     * @param url 要打开的URL
     * @throws IOException 如果发生I/O异常
     */
    private static void openWithProcessBuilder(String url) throws IOException {
        ProcessBuilder processBuilder = new ProcessBuilder("C:\\Program Files\\Mozilla Firefox\\firefox.exe", url);
        processBuilder.start();
    }

    /**
     * 批量打开
     *
     * @param urls url
     * @throws IOException IOException
     */
    public static void openWithBatch(String[] urls, Consumer<String> open) throws IOException {
        for (String url : urls) {
            open.accept(url);
        }
    }

    /**
     * 主方法，用于测试
     *
     * @param args 命令行参数
     */
    public static void main(String[] args) {
        try {
            // 在这里替换成你要打开的具体URL列表
            String[] targetURLs = {
                    "https://mgt.bss-large-model.com",
                    "https://uconsole.bss-large-model.com",
            };

            for (String targetURL : targetURLs) {
                // 使用默认浏览器打开
                //openDefaultBrowser(targetURL);

                // 使用环境变量浏览器打开
                // openWithEnvironmentBrowser(targetURL);

                // 使用cmd打开
                openWithCmd(targetURL);

                // 使用ProcessBuilder打开
                // openWithProcessBuilder(targetURL);
            }

        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
